-
Notifications
You must be signed in to change notification settings - Fork 23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add solution for BinarySearchTree #11
base: master
Are you sure you want to change the base?
Conversation
|
||
public BinarySearchTree() | ||
{ | ||
super(0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is the root randomly 0? It will be extremely unexpected if a user constructs an "empty" binary search tree, but minValue or maxValue will return 0.
// insert node | ||
@Override | ||
public boolean insert(int value) { | ||
super.root = insert(super.root, value); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if the node already exists? This function always returns true regardless of whether the insert "fails" or succeeds.
private TreeNode insert(TreeNode root, int data) | ||
{ | ||
// if current node is null, insert node with data | ||
if (root == null) root = new TreeNode(data); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If both your if and else blocks have a single line, this formatting is fine, like the way you have used below.
However, in this case, please adhere to the repo's coding style of
if (<condition>) {
}
else {
}
Curly braces are good. Always use them, even when they are not needed.
@Override | ||
public boolean delete(int value) { | ||
super.root = deleteRec(super.root, value); | ||
if(flag==1) {flag=0;return false;} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please format as
if (flag == 1) {
flag = 0;
return false;
}
Note the spaces
|
||
class BinarySearchTree extends BinaryTree { | ||
|
||
private int flag = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any reason why this is not a boolean
? Also, why is it a member variable? What does "BinarySearchTree.flag" mean for the tree as a whole?
else return true; | ||
} | ||
|
||
TreeNode deleteRec(TreeNode root, int key) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please follow code style of opening the curly brace on the same line.
return root; | ||
} | ||
|
||
// delete node |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this comment really necessary? The function name is delete
. Self-documenting code.
super(0); | ||
} | ||
|
||
// insert node |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this comment really necessary? The function name is insert
. Self-documenting code.
} | ||
|
||
// find the lowest value in the tree by reaching the leftmost leaf node | ||
int minValue(TreeNode root) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens when the tree is empty?
return minv; | ||
} | ||
|
||
// check if node exists |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this comment really necessary? The function name is exists
. Self-documenting code.
|
||
public void inOrderTraversal() { | ||
//TODO | ||
inorderRec(root); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am assuming that inOrderRec()
stands for inOrderRecursive
. However, there is no way for me to know this, since it's not a convention. Please name it inOrderRecursive
} | ||
|
||
// set left node | ||
public void setLeft(TreeNode n) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is really bad! We do not want setters on a TreeNode
. Imagine what happens if I insert a TreeNode into a BinarySearchTree, and then set its value to be something else. Now you've violated the BinarySearchTree invariant.
Additionally, member variables without an explicit access modifier are default
, and have package level access. Thus we don't really need getters either.
(In the ideal case, the TreeNode
class would be immutable.)
// traverse to right sub-tree if value to be inserted is greater than value in current node | ||
else if (key > root.data) root.right = deleteRec(root.right, key); | ||
|
||
// if value is same as current value, delte it |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typo in comment, should be "delete"
if (root == null) root = new TreeNode(data); | ||
else | ||
{ | ||
// traverse to left sub-tree if value to be inserted is lesser than value in current node |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Your comment says "lesser than", but your code says "lesser than or equal to". Decide which one is incorrect.
tl;dr The long version Some broad improvements you can make:
If you want, go ahead and make the above changes, and I'll review again. Cheers and happy learning 😄 |
@@ -0,0 +1,123 @@ | |||
// This class fails to compile, can you figure out why, and fix it? | |||
// This is beacuse BinaryTree has a constructor which is not default. Hence, when we extend this class and try to call a no-argument constructor, it'll give a compile-time error. so, we call it by passing the parameters (to instantiate the root node) in super() called inside the constructor of BinarySearchTree |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please use multiline comments for long comments.
/* line1
* line2
*/
else return tn; | ||
} | ||
|
||
// the node value present in between a and b is the lca. Assuming, a<b |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why assume that a < b? Why not ensure it?
{ | ||
if(root == null) {flag=1;return null;} | ||
|
||
if(root.data>b && root.data>a) lca(root.left,a,b); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you have assumed that a < b, is it really necessary to check if root.data
is greater than both of them?
if(root == null) {flag=1;return null;} | ||
|
||
if(root.data>b && root.data>a) lca(root.left,a,b); | ||
else if(root.data<b && root.data<a) lca(root.right,a,b); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you have assumed that a < b, is it really necessary to check if root.data
is lesser than both of them?
Thank you for the review. I have taken all the improvements and suggestions into consideration and have come up with a more refined solution. Let me know if more changes are required. |
Solution for the BinaryTree problem in Session8.
Answer for question in BinarySearchTree.java in comments.
Comments for each function also included.
I observed that the solution for LinkedList was present already. So, didn't add that.